package com.wzf.greattruth.aio;

import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousSocketChannel;
import java.nio.channels.CompletionHandler;

/**
 * 
 * @author wuzhengfei
 *
 */
public class ServerAcceptCompletionHandler implements CompletionHandler<AsynchronousSocketChannel, AsyncServerHandler> {

	@Override
	public void completed(AsynchronousSocketChannel channel, AsyncServerHandler attachment) {
		/**
		 * 为什么需要再次调用accept方法？
		 * 因为如果有新的客户端连接接入，系统将回调我们传入的CompletionHandler示例的complete方法，表示新的客户端接入成功
		 * 因为一个AsynchronousServerSocketChannel可以接收成千上万个客户端，所以需要继续调用他的accept方法，
		 * 接收其他客户端连接，最终形成一个循环。每当接收一个客户连接成功后，再异步接收新的客户端连接
		 * 
		 */
		attachment.asynServerSocketChannel.accept(attachment, this);
		ByteBuffer buffer = ByteBuffer.allocate(1024);
		/**
		 * ByteBuffer:接收缓冲区，用于从异步的Channel中读取数据包
		 * Attachment：异步Channel携带的附件，通知回调的时候作为入参使用
		 * CompletionHandler：接收通知回调的业务Handler
		 */
		channel.read(buffer, buffer, new ServerReadCompletionHandler(channel));
	}

	@Override
	public void failed(Throwable exc, AsyncServerHandler attachment) {
		exc.printStackTrace();
		attachment.latch.countDown();
	}

}
